package cn.sjx.modules.nbiot.entity.receive;

import cn.hutool.core.date.DateUtil;
import io.netty.buffer.ByteBuf;
import lombok.Data;
import lombok.experimental.Accessors;

import java.nio.charset.Charset;
import java.util.Date;

/**
 * 如果需要心跳包，需联系相关销售人员提出要求，出厂前可进行配置，如果未配置有心跳包功能已出厂的设备，无法进行配置修改。
 * 地磁心跳包报文结构说明（0X21）
 *
 * @Author: sjx
 * @Date: 2019年08月30日 0030 13:30:52
 */
@Data
@Accessors(chain = true)
public class IotProtocolReceive_0x21 extends IotProtocolReceiveBase {

    /**
     *<p>
     *  字段名称：地磁信号
     *  说明：参考值
     *  字节：1
     *</p>
     */
    private int magRssi;

    /**
     * <p>
     *  字段名称：预留字段1
     *  说明：预留字段
     *  字节：7
     * </p>
     */
    private String reserverd1;

    /**
     *<p>
     *  字段名称：事件时间
     *  说明：事件发生时间相对于1970-1-1经过的秒总数
     *  字节：8
     *</p>
     */
    private long nowTime;

    /**
     *<p>
     *  字段名称：地磁状态
     *  说明：0:无车 1：有车
     *  字节：4
     *</p>
     */
    private int state;

    /**
     *<p>
     *  字段名称：批次号
     *  说明：停车批次号
     *  字节：2
     *</p>
     */
    private short packCount;

    /**
     *<p>
     *  字段名称：地磁电量
     *  说明：地磁一共 0-7 档
     *  字节：1
     *</p>
     */
    private byte magVoltage;

    /**
     *<p>
     *  字段名称：地磁编号
     *  说明：地磁唯一编码
     *  字节：4
     *</p>
     */
    private int magId;

    /**
     *<p>
     *  字段名称：地磁信号
     *  说明：地磁信号强度
     *  字节：1
     *</p>
     */
    private byte signalPower;

    // region ====================================== 自定义扩展字段 ======================================

    /**
     * 事件时间
     */
    private Date nowTimeDate;

    // end region ================================== 自定义扩展字段 ======================================

    @Override
    protected void decodeImpl(ByteBuf buf) {
        // 获取地磁信号
        byte tempMagRssi = buf.readByte();
        this.magRssi = tempMagRssi & 0xFF;

        // 获取预留字段
        this.reserverd1 = buf.readBytes(7).toString(Charset.forName("GBK")).trim();

        // 获取事件时间
        this.nowTime = buf.readLong();

        // 获取地磁状态
        this.state = buf.readInt();

        // 获取批次号
        this.packCount = buf.readShort();

        // 获取地磁电量
        this.magVoltage = buf.readByte();

        // 获取地磁编号
        this.magId = buf.readInt();

        // 获取地磁信号
        this.signalPower = buf.readByte();

        // 设置Date类型事件时间，地磁时间错误（<= 2019-06-01 00:00:00） 则取项目所在服务器时间
        if (nowTime <= 1559318400) {
            setNowTimeDate(DateUtil.date());
        } else {
            setNowTimeDate(DateUtil.date(nowTime * 1000));
        }
    }
}
